package com.angel.provider.pdf;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.angel.core.util.JsonUtil;
import com.angel.core.util.MatcherUtil;
import com.angel.core.util.StringUtils;
import com.angel.health.BuzCustomer;
import com.angel.health.BuzExaminationParsingWithBLOBs;
import com.angel.health.PDFEntity;

/**
 * @author cheng sir 2016年9月10日下午3:45:08
 */
public class ParsingPdf {

	/**
	 * 解析上传的pdf格式体检报告的上半部分 体检报告pdf中上半部分为用户基本信息部分，下半部分为体检结果。分开解析
	 * 上半部分读取时不能排序，排序会导致行不正确
	 */
	public static PDFEntity parsingAbove(String content) throws Exception{
		PDFEntity pdfEntity = new PDFEntity();
		BuzCustomer customer = new BuzCustomer();
		BuzExaminationParsingWithBLOBs blobs = new BuzExaminationParsingWithBLOBs();
		String[] _con = content.split("\\n");
		for (String con : _con) {
			// 页数行过滤	空行跳过
			try {
				con = con.trim();
				if (MatcherUtil.isPage(con) || StringUtils.isEmpty(con)) {
					continue;
				}
				// 体检机构
				if (MatcherUtil.isMedical(con)) {
					blobs.setInstitutions(con.substring(con.indexOf("感谢您来") + "感谢您来".length(), con.indexOf("体检机构体检")));
				}
				// 年龄出生年月性别姓名
				if (MatcherUtil.isAgeBirthSexNname(con)) {
					pdfEntity.setAge(con.substring(0, con.indexOf("年龄")));
					customer.setBirthday(con.substring(con.indexOf("年龄") + "年龄".length(), con.indexOf("出生年月")));
					String sex = con.substring(con.indexOf("出生年月") + "出生年月".length(), con.indexOf("性别"));
					if(!StringUtils.isEmpty(sex)){
						if("男".equals(sex)){
							customer.setSex(1);
						}else if("女".equals(sex)){
							customer.setSex(2);
						}else{
							customer.setSex(0);
						}
					}
					customer.setName(con.substring(con.indexOf("性别") + "性别".length(), con.indexOf("姓名")));
				}
				// 婚否证件号民族国籍
				if (MatcherUtil.isHunZjMzGj(con)) {
					String isMarried = con.substring(0, con.indexOf("婚否"));
					if(!StringUtils.isEmpty(isMarried)){
						if("已".equals(isMarried)||"已婚".equals(isMarried)){
							customer.setMarry(1+"");
						}else if("未".equals(isMarried)||"未婚".equals(isMarried)){
							customer.setMarry(2+"");
						}else if("离异".equals(isMarried)||"离".equals(isMarried)||"异".equals(isMarried)){
							customer.setMarry(3+"");
						}else if("丧偶".equals(isMarried) || "丧".equals(isMarried)){
							customer.setMarry(4+"");
						}else{
							customer.setMarry("5");
						}
					}
					customer.setCardNumber(con.substring(con.indexOf("婚否") + "婚否".length(), con.indexOf("证件号")));
					customer.setNational(con.substring(con.indexOf("证件号") + "证件号".length(), con.indexOf("民族")));
					customer.setNationality(con.substring(con.indexOf("民族") + "民族".length(), con.indexOf("国籍")));
				}
				// 宅电电子邮件
				if (MatcherUtil.isZdEmail(con)) {
					customer.setMemPhone((con.substring(0, con.indexOf("宅电"))));
					customer.setEmail(con.substring(con.indexOf("宅电") + "宅电".length(), con.indexOf("电子邮件")));
				}
				// 办公电话通讯地址
				if (MatcherUtil.isBgdhTxdz(con)) {
					pdfEntity.setWorkPhone(con.substring(0, con.indexOf("办公电话")));
					pdfEntity.setCurrentAddress(con.substring(con.indexOf("办公电话") + "办公电话".length(), con.indexOf("通讯地址")));
				}
				// 手机工作单位
				if (MatcherUtil.isPhoneGzdw(con)) {
					customer.setMemPhone(con.substring(0, con.indexOf("手机")));
					pdfEntity.setCompany(con.substring(con.indexOf("手机") + "手机".length(), con.indexOf("工作单位")));
				}
				// 体检时间
				if (MatcherUtil.isMedicalTime(con)) {
					String year = con.substring(0, con.indexOf("年")).trim();
					String month = con.substring(con.indexOf("年") + 1, con.indexOf("月")).trim();
					String day = con.substring(con.indexOf("月") + 1, con.indexOf("日")).trim();
					if(!StringUtils.isEmpty(year)){
						if(year.length() != 4){
							year = String.valueOf(Integer.parseInt(year) + 2000);
						}
					}
					if(!StringUtils.isEmpty(month)){
						if(month.length() == 1){
							month = "0" + month;
						}
					}
					if(!StringUtils.isEmpty(day)){
						if(day.length() == 1){
							day = "0" + day;
						}
						blobs.setMedicalTime(new SimpleDateFormat("yyyy-MM-dd").parse(year + "-" + month + "-" + day));
					}
				}
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		pdfEntity.setCustomer(customer);
		pdfEntity.setBlobs(blobs);
		return pdfEntity;
	}

	/**
	 * 解析pdf下半部分，从（体 检 结 果）往下开始解析
	 * 
	 * @param content
	 */
	public static Map<String, Object> parsingBelow(String content) throws Exception{
		
		String[] _con = content.split("\\n");
		List<String> asList = Arrays.asList(_con);// pdf中所有行数据
		// Map<String,List<String>> map = new HashMap<String,
		// List<String>>();//key:value("一般体检"：list("身高","体重"))
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		String sub = "";// 目前遍历所在的科目
		// List<String> list = new ArrayList<String>();//当前科目中所有指标
		Map<String, Object> _map = new LinkedHashMap<String, Object>();
		int start_site = asList.indexOf("体　检　结　果");
		String rxcc = "";
		for (int i = start_site + 1; i < asList.size(); i++) {
			String value = asList.get(i).trim();
			
			// 体检日期行过滤 页数行过滤 空行跳过 检查医生行过滤
			if (MatcherUtil.isMedicalTime(value) || MatcherUtil.isPage(value) || StringUtils.isEmpty(value)) {
				if(i == 250 && !_map.isEmpty()){
					map.put(sub, _map);
				}
				continue;
			}

			
			/**
			 * 若下一行存在 并且下一行为表头（项目 结果） 则该行为科目名称
			 * 
			 * 若当前是行为表头（项目 结果）
			 */
			String nextValue = "";
			if(i+1 < asList.size()){
				nextValue = asList.get(i + 1).trim();// 下行的值
			}
			if("心电图".equals(value) && !MatcherUtil.isTitle(nextValue)){
				sub = value;
				_map = new LinkedHashMap<String, Object>();
				continue;
			}
			
			if (i + 1 < asList.size() & MatcherUtil.isTitle(nextValue)) {
				if (!sub.equals(value)) {
					if (!StringUtils.isEmpty(sub)) {
						map.put(sub, _map);
					}
					sub = value;
					_map = new LinkedHashMap<String, Object>();
					continue;
				}
			} else if (MatcherUtil.isTitle(value)) {
				continue;
			} else {
				if (value.contains("体检所见:") || value.contains("检查所见:") || value.contains("检验结果:")) {
					if("乳腺彩超".equals(sub)){
						_map.put("tjsj", value.substring(5, value.length()).trim()+","+asList.get(i+1).trim());
						i = i+1;
					}else{
						_map.put("tjsj", value.substring(5, value.length()).trim());
					}
				} else {
					String[] _value = value.split(" ");
					if("乳腺彩超".equals(sub) ){
						if(value.contains("乳腺彩超")){
							if(asList.get(i+1).trim().split(" ").length == 1){
								_map.put("乳腺彩超", value.replace("乳腺彩超", "")+asList.get(i+1).trim());
								i = i+1;
								continue;
							}
						}
						
					}else if("外科".equals(sub)){
						if(value.contains("乳腺")){
							if(asList.get(i+1).trim().split(" ").length == 1){
								_map.put("乳腺", value+asList.get(i+1).trim());
								i = i+1;
								continue;
							}
						}
					}
					String result = "";
					for (int j = 1; j < _value.length; j++) {
						if (!StringUtils.isEmpty(_value[j])) {
							result = _value[j];
							break;
						}
					}
					if(MatcherUtil.isDoctor(_value[0])){
						_map.put("jcys", result);//检查医师
					}else{
						_map.put(_value[0].replace("（", "(").replace("）", ")").trim(), result);
					}
				}
			}
		}
		return map;
	}

	/**
	 * 解析 汇 总 分 析 温馨提示 总检意见
	 */
	public static Map<String, Object> parsingTop(String content) throws Exception{
		Map<String, Object> map = new HashMap<String, Object>();
		String[] _con = content.split("\\n");
		List<String> asList = Arrays.asList(_con);// pdf中所有行数据
		int hzfx_start = asList.indexOf("汇　总　分　析");// 汇总分析开始位置

		int wxts_start = asList.indexOf("温馨提示");// 温馨提示开始位置

		int zjyj_start = asList.indexOf("总检意见");// 总检意见开始位置

		int jbxi_start = asList.indexOf("客人基本信息");// 基本信息位置

		String obj = "";
		// 读取到客人基本信息位置停止
		for (int i = hzfx_start + 1; i < jbxi_start; i++) {
			String value = asList.get(i).trim();
			// 体检日期行过滤 页数行过滤 空行跳过 检查医生行过滤
			if (MatcherUtil.isMedicalTime(value) || MatcherUtil.isPage(value) || StringUtils.isEmpty(value)
					|| (MatcherUtil.isDoctor(value) && !value.contains("检查所见:"))) {
				if (i == jbxi_start - 1) {
					map.put("总检意见", obj);
				}
				continue;
			}
			// 提取汇总分析部分
			if (i != wxts_start && i != zjyj_start) {
				obj += value;
			}
			if (i == wxts_start) {
				map.put("汇总分析", obj);
				obj = "";
			} else if (i == zjyj_start) {
				map.put("温馨提示", obj);
				obj = "";
			} else if (i == jbxi_start - 1) {
				map.put("总检意见", obj);
				obj = "";
			}
		}
		return map;
	}
}
